package com.foxcai.novel.format;

import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

/**
 * <b>功能描述：</b><br>
 * 格式化公用方法类<br>
 * 
 */
public class PubFormat {
	/**
	 * 数据库存储的默认时间格式
	 */
	public static final String DEFAULT_TIME_FORMAT_DB = "yyyyMMddHHmmss";

	/**
	 * 默认时间格式(EN)
	 */
	public static final String DEFAULT_TIME_FORMAT_EN = "yyyy-MM-dd HH:mm:ss";

	/**
	 * 默认时间格式(中文)
	 */
	public static final String DEFAULT_TIME_FORMAT_CN = "yyyy年MM月dd日 HH:mm:ss";

	/**
	 * 默认日期格式(EN)
	 */
	public static final String DEFAULT_DATE_FORMAT_EN = "yyyy-MM-dd";

	/**
	 * 默认日期格式(中文)
	 */
	public static final String DEFAULT_DATE_FORMAT_CN = "yyyy年MM月dd日";

	/**
	 * 段内位置表示
	 */
	protected static final char[] CHINESE_MONEY_CONVERT_GROUP_IN = { '拾', '佰',
			'仟' };

	/**
	 * 段名表示
	 */
	protected static final char[] CHINESE_MONEY_CONVERT_GROUP_OUT = { '万', '亿',
			'兆' };

	/**
	 * 数字表示
	 */
	protected static final char[] CHINESE_MONEY_CONVERT_DIGIT = { '零', '壹',
			'贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' };

	/**
	 * 单位表示
	 */
	protected static final String[] CHINESE_MONEY_UNIT = { "整", "分", "角", "圆" };

	/**
	 * 禁用构造函数
	 */
	private PubFormat() {
		// 禁用构造函数
	}

	/**
	 * 显示中文金额
	 * 
	 * @param money
	 *            带小数点的实际金额字符
	 * @return String
	 */
	public static String formatChineseCurrency(String money) {
		try {
			int dotPostion = money.indexOf('.');
			int decimalPart = 0; // 小数部分
			String integerPart = ""; // 整数部分
			if (dotPostion > -1) { // 传入数据有小数点
				if (Integer.parseInt(money.substring(dotPostion + 1)) > 0
						&& dotPostion > -1)// lilh@yuchengtech.com
				// 2008-10-23修改，输入1以下的小数时会抛错
				{
					decimalPart = Integer.parseInt(money
							.substring(dotPostion + 1));
					integerPart = money.substring(0, dotPostion);
				} else {
					integerPart = money.substring(0, dotPostion);// lilh@yuchengtech.com
					// 2008-10-24修改
				}
			} else {
				integerPart = money;
			}

			StringBuffer prefix = new StringBuffer(); // 整数部分转化的结果
			StringBuffer suffix = new StringBuffer(); // 小数部分转化的结果
			// 处理小数点后面的数
			if (decimalPart == 0) { // 如果小数部分为0
				suffix.append(CHINESE_MONEY_UNIT[0]);
			} else {
				if (decimalPart < 10) {
					// 转换分
					suffix.append(CHINESE_MONEY_CONVERT_DIGIT[decimalPart]);
					suffix.append(CHINESE_MONEY_UNIT[1]);
				} else if (decimalPart % 10 == 0) {
					// 转换角
					suffix
							.append(CHINESE_MONEY_CONVERT_DIGIT[decimalPart / 10]);
					suffix.append(CHINESE_MONEY_UNIT[2]);
				} else {
					// 转换角分
					suffix
							.append(CHINESE_MONEY_CONVERT_DIGIT[decimalPart / 10]);
					suffix.append(CHINESE_MONEY_UNIT[2]);
					suffix
							.append(CHINESE_MONEY_CONVERT_DIGIT[decimalPart % 10]);
					suffix.append(CHINESE_MONEY_UNIT[1]);
				}
			}
			// 处理小数点前面的数
			char[] chDig = integerPart.toCharArray(); // 把整数部分转化成字符数组
			boolean zero = false; // 标志'0'表示出现过0
			byte zeroSerNum = 0; // 连续出现0的次数
			for (int i = 0; i < chDig.length; i++) { // 循环处理每个数字
				int idx = (chDig.length - i - 1) % 4; // 取段内位置
				int vidx = (chDig.length - i - 1) / 4; // 取段位置
				if (chDig[i] == '0') { // 如果当前字符是0
					zeroSerNum++; // 连续0次数递增
					if (zero == false) { // 标志
						// zero = CHINESE_MONEY_CONVERT_DIGIT[0];
						zero = true;
						if (idx == 0 && vidx > 0) {
							prefix
									.append(CHINESE_MONEY_CONVERT_GROUP_OUT[vidx - 1]); // 段结束位置应该加上段名如万,亿
						}
					} else if (idx == 0 && vidx > 0 && zeroSerNum < 4) {
						prefix
								.append(CHINESE_MONEY_CONVERT_GROUP_OUT[vidx - 1]);
						zero = false;
					}
					continue;
				}
				zeroSerNum = 0; // 连续0次数清零
				if (zero) { // 如果标志不为0,则加上,例如万,亿什么的
					prefix.append(CHINESE_MONEY_CONVERT_DIGIT[0]);
					zero = false;
				}
				prefix.append(CHINESE_MONEY_CONVERT_DIGIT[chDig[i] - '0']); // 转化该数字表示
				if (idx > 0) {
					prefix.append(CHINESE_MONEY_CONVERT_GROUP_IN[idx - 1]);
				}
				if (idx == 0 && vidx > 0) {
					prefix.append(CHINESE_MONEY_CONVERT_GROUP_OUT[vidx - 1]); // 段结束位置应该加上段名如万,亿
				}
			}
			if (prefix.length() > 0)
				prefix.append(CHINESE_MONEY_UNIT[3]); // 如果整数部分存在,则有圆的字样
			return prefix.append(suffix).toString(); // 返回正确表示
		} catch (Exception e) {
			return "input error";
		}
	}

	/**
	 * 反格式化金额，将含有,的金额中的,去掉
	 * 
	 * @param currency
	 *            String
	 * @return String
	 */
	public static String unFormatCurrency(String currency) {
		return currency.replaceAll("\\,", "");
	}

	/**
	 * 格式化金额
	 * 
	 * @param currency
	 *            String
	 * @return String
	 */
	public static String formatCurrency(String currency) {
		if (currency == null)
			return "";
		try {
			double dCurr = Double.parseDouble(currency);
			DecimalFormat dFmt = new DecimalFormat("#,##0.00");
			return dFmt.format(dCurr);
		} catch (Exception ex) {
			return currency;
		}
	}

	/**
	 * 根据参数格式显示格式化日期
	 * 
	 * @param date
	 * @param format
	 *            String
	 * @return String
	 */
	public static String formatDate(String date, String format) {
		Date dt = null;
		SimpleDateFormat inFmt = null, outFmt = null;
		ParsePosition pos = new ParsePosition(0);
		if ((date == null) || (date.trim().equals("")))
			return "";
		try {
			if (Long.parseLong(date) == 0)
				return "";
		} catch (Exception nume) {
			return date;
		}
		try {
			switch (date.trim().length()) {
			case 14:
				inFmt = new SimpleDateFormat("yyyyMMddHHmmss");
				break;
			case 12:
				inFmt = new SimpleDateFormat("yyyyMMddHHmm");
				break;
			case 10:
				inFmt = new SimpleDateFormat("yyyyMMddHH");
				break;
			case 8:
				inFmt = new SimpleDateFormat("yyyyMMdd");
				break;
			case 6:
				inFmt = new SimpleDateFormat("yyyyMM");
				break;
			default:
				return date;
			}
			if ((dt = inFmt.parse(date, pos)) == null)
				return date;
			if ((format == null) || (format.trim().equals(""))) {
				outFmt = new SimpleDateFormat("yyyy年MM月dd日");
			} else {
				outFmt = new SimpleDateFormat(format);
			}
			return outFmt.format(dt);
		} catch (Exception ex) {
			return date;
		}
	}

	/**
	 * 重新格式化时间
	 * 
	 * @param datetime
	 *            原有时间字符串，如20050101
	 * @param oldFormat
	 *            原有时间字符串的格式，如20050101160145为"yyyyMMddHHmmss"
	 * @param newFormat
	 *            新的时间字符串的格式，如2005-01-01 16:01:45为"yyyy-MM-dd HH:mm:ss"
	 * @return String
	 */
	public static String convertTimeFormat(String datetime, String oldFormat,
			String newFormat) {
		SimpleDateFormat oldFmt = null, newFmt = null;
		oldFmt = new SimpleDateFormat(oldFormat);
		newFmt = new SimpleDateFormat(newFormat);
		Date date = null;
		try {
			date = oldFmt.parse(datetime);
			return newFmt.format(date);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return datetime;
	}

	/**
	 * 取得指定时间间隔后的系统时间<br>
	 * 示例：<br>
	 * getDifferentTime( 1, 2, 3,"yyyyMMddHHmmss") <br>
	 * 使用yyyyMMddHHmmss格式输出1小时2分3秒后的系统时间<br>
	 * getDifferentTime( -24, 0, 0,"yyyyMMdd") <br>
	 * 使用yyyyMMdd格式输出1天前的系统日期<br>
	 * 
	 * @param hour
	 *            小时
	 * @param minute
	 *            分钟
	 * @param second
	 *            秒
	 * @param timeFormat
	 *            格式化
	 * @return String
	 */
	public static String getDifferentTime(int hour, int minute, int second,
			String timeFormat) {
		String format = (timeFormat == null) ? PubFormat.DEFAULT_TIME_FORMAT_DB
				: timeFormat;
		GregorianCalendar calendar = (GregorianCalendar) Calendar.getInstance();
		calendar.add(Calendar.HOUR, hour);
		calendar.add(Calendar.MINUTE, minute);
		calendar.add(Calendar.SECOND, second);
		SimpleDateFormat formatter = new SimpleDateFormat(format);
		return formatter.format(calendar.getTime());
	}

	/**
	 * 取得若干天前/后的系统日期
	 * 
	 * @param days
	 *            与现在相隔的日数，正数为当前日期之后，负数为当前日期之前
	 * @param timeFormat
	 *            格式化
	 * @return String
	 */
	public static String getDifferentDate(int days, String timeFormat) {
		return getDifferentTime(24 * days, 0, 0, timeFormat);
	}

	/**
	 * 获取内容摘要，即字符串的前n个字符
	 * 
	 * @param content
	 *            原文
	 * @param summaryLength
	 *            摘要长度
	 * @return String
	 */
	public static String getSummary(String content, int summaryLength) {
		if (content == null || summaryLength < 1) {
			return "";
		} else {
			if (content.length() > summaryLength) {
				return content.substring(0, summaryLength);
			} else {
				return content;
			}
		}
	}

	/**
	 * 如果是空值，则以参数指定字符串取代
	 * 
	 * @param dataValue
	 * @param returnValue
	 * @return String
	 */
	public static String nvl(Object dataValue, String returnValue) {
		if (null == dataValue || dataValue.toString().length() == 0)
			return returnValue;
		else
			return dataValue.toString();
	}
}
